home *** CD-ROM | disk | FTP | other *** search
- #if !defined(CRT0) && !defined(BCRT0) && !defined(RCRT0)
- #define CRT0
- #endif
- #ifdef CRT0
- | normal (large data model) startup code
- #endif
- #ifdef BCRT0
- | base relative (short data model) startup code
- #endif
- #ifdef RCRT0
- | resident (short data model) startup code
- #endif
- .text
- .even
- .globl ___amain
- .globl ___aexit
- #ifndef RCRT0
- .globl _geta4
- #endif
-
- moveml #0x7ffe,sp@- | push registers
- #ifdef BCRT0
- lea ___a4_init,a4 | set global data segment pointer
- #endif
- #ifdef RCRT0
- movel 4,a6 | get SysBase ->a6
- movel a0,a2 | store argument ->a2
- movel #___data_size,d2 |
- addl #___bss_size,d2 | global data segment size ->d2
- movel d2,d0 | size
- moveql #0,d1 | MEMF_ANY
- jsr a6@(-198) | AllocMem
- movel d0,a4 | new global data segment ->a4
- jne gotit | yes ?
- moveql #20,d0 | oh, dear
- jra error |
- gotit: |
- lea ___a4_init,a3 | old global data segment pointer
- subw #32766,a3 | old global data segment ->a3
- movel d2,d0 | size
- movel a3,a0 | old
- movel a4,a1 | new
- jsr a6@(-624) | CopyMem
- movel a3,d0 |
- subl a4,d0 | old-new ->d0
- movel #___datadata_relocs,a0 | pointer relocation table ->a0
- movel a0@+,d1 | number of pointers ->d1
- jeq loopend | none ?
- loop: |
- movel a0@+,a1 | get offset of next pointer
- subl d0,a1@(a4:l) | and fix it
- subql #1,d1 |
- jne loop | ready ?
- loopend: |
- movel a4,sp@- | push memory address
- movel d2,sp@- | and size
- addw #32766,a4 | get new global data segment pointer
- movel a2,a0 | remember argument
- #endif
- #ifdef CRT0
- movel a7,stackpointer | store stackpointer
- #else
- movel a7,a4@(-32766:w) | store stackpointer
- #endif
- movel a0,sp@- | push Argument
- jsr ___amain | call __amain(), does not return
- ___aexit:
- #ifdef RCRT0
- movel sp@(4),d2 | remember returncode
- #else
- movel sp@(4),d0 | get returncode
- #endif
- #ifdef CRT0
- movel stackpointer,a7 | set stackpointer
- #else
- movel a4@(-32766:w),a7 | set stackpointer
- #endif
- #ifdef RCRT0
- movel 4,a6 | get SysBase
- movel sp@+,d0 | pop memory size
- movel sp@+,a1 | and address
- jsr a6@(-210) | FreeMem()
- movel d2,d0 | get returncode
- error: |
- #endif
- moveml sp@+,#0x7ffe | pop registers
- #ifdef CRT0
- _geta4: |
- #endif
- rts |
- #ifdef BCRT0
- _geta4: | Set global-data segment pointer
- lea ___a4_init,a4 |
- rts |
- #endif
-
- .data
- .even
- stackpointer:
- .long 0
-